<?php
error_reporting(0);
$error = array();
/**
 * НАСТРОЙКИ
 */ 
//НАСТРОЙКИ ДИРРЕКТОРИЙ
$url = 'http://m.key.ru/export/';
$outpath = '/data/www/localhost/htdocs/export/';

//НАСТРОЙКИ ОТПРАВКИ E-MAIL
//Кому отправляем
$mailSettings['to'] = array();
$mailSettings['to'] [] = 'thunder@key.ru';
//$to[] = 'wez@example.com';

//Тема письма
$mailSettings['subject'] = 'Ошибка генерации YML файла';

//Заголовки
$mailSettings['headers']  = 'MIME-Version: 1.0' . "\r\n";
$mailSettings['headers'] .= 'Content-type: text/html; charset=UTF-8' . "\r\n";



//----------------------------------------------------------------------------------------//
$arFiles = getFilesListByUrl($url);
if(!empty($arFiles)){
  //Проходим по путям
  foreach ($arFiles as $fileName) {
    $data = getFileDataByUrl($url . $fileName);
    if(!empty($data)){
      $yml = getYml($data);
      if(empty($yml['error']) || $yml['error'] == "<"){
        $newFileName = str_replace('json', 'yml', $fileName);
        if (is_writable($newFileName) || !file_exists($newFileName)){
/*          $fh = fopen($newFileName, "w");
          fwrite($fh, $yml);
          fclose($fh); */
		  file_put_contents($outpath.$newFileName, $yml);
        }
        else
          $error[] = "Невозможно открыть файл для записи " . $newFileName; 
      }
      else{
        $error[] = $yml['error'];
      }    
    }  
    else{
      $error[] = 'Файл пуст или не читабелен.'; 
    }
  }  
  if(!empty($GLOBALS['newVendors'])){
    foreach ($GLOBALS['newVendors'] as $vendor=>$model) {
      $error[] = 'Отсутствует призводитель "' . $vendor . '". Пример товара: "' . $model . '". Внесите имя производителя в список синонимов, только после этого товар попадет в Яндекс Маркет';     
    }
  }
}
else
  $error[] = 'Не удалось получить файлы с сервера. ' . $url; 
getPage($error, $mailSettings);  
  
//вывод страницы
function getPage($error, $mailSettings){
	//print_r($error);
      if(!empty($error)){
        mail(join(', ', $mailSettings['to']), $mailSettings['subject'], join("<br/> ", $error), $mailSettings['headers']);  
      }
} 

//обработка данных и генерация XML
function getYml($data){
  require('synonyms.php');
  foreach($synonyms as $vender=>$venderSynonym){
	 $arSynonims[mb_strtolower($vender, 'utf8')] = mb_strtolower($venderSynonym, 'utf8');
  }
  $synonyms = $arSynonims;
  unset($arSynonims);
  
  $data = json_decode($data, true);
  if(empty($data[0]['category']))
    return array('Не тот формат данных');
    
  //рекурсивная чистка данных
  cleanArrayRecursive($data);
  //разбираем категории
  $arCategories = array(0=>'');
  foreach($data as $num=>$arOffer){
    $arOffer['category'] = trim($arOffer['category']);
    if(!in_array($arOffer['category'], $arCategories))
      $arCategories[] = $arOffer['category'];
    $data[$num]['categoryId'] = array_search($arOffer['category'], $arCategories);
    $data[$num]['description'] = ereg_replace("\+ подарок.*", '', $data[$num]['description']);        
  }
  unset($arCategories[0]);
      
  
  ob_start();
  $xml=new xml_output();
  $xml->startXML();
  $xml->elementStart('yml_catalog', array('date' => date('Y-m-d H:i')));
    $xml->elementStart('shop');
      //имя магазина
      $xml->elementStart('name');
        $xml->text('«КЕЙ». СЕТЬ СУПЕРМАРКЕТОВ ЦИФРОВОЙ ТЕХНИКИ.');
      $xml->elementEnd('name');
      //компнаия   
      $xml->elementStart('company');
        $xml->text('КЕЙ');
      $xml->elementEnd('company');
      //url
      $xml->elementStart('url');
        $xml->text('http://catalog.key.ru/');
      $xml->elementEnd('url'); 
      
      //currencies
      $xml->elementStart('currencies');
        $xml->elementStart('currency', array('id'=>'RUR', 'rate'=>'1'));
        $xml->elementEnd('currency');
      $xml->elementEnd('currencies');
          
      //категории
      $xml->elementStart('categories');
        foreach($arCategories as $id=>$category){
          $xml->elementStart('category', array('id'=>$id));
            $xml->text($category);
          $xml->elementEnd('category');           
        }
      $xml->elementEnd('categories');      
      
      //товары
      $xml->elementStart('offers');
      foreach($data as $offer){
        //разбираемся с моделями и произовиделями
        //если в модели есть производитель, то вычищаем его
        if(is_int(mb_stripos($offer['model'], $offer['vendor'], 0, 'utf8'))){
          $offer['model'] = trimByVendor($offer['model'], $offer['vendor']);
        }//иначе пытамся вырезать синоним
        elseif(isset($synonyms[mb_strtolower($offer['vendor'])]) && mb_stripos($synonyms[strtolower($offer['vendor'])], '*') === false){        
          $offer['model'] = trimByVendor($offer['model'], $synonyms[strtolower($offer['vendor'])]);
        }//иначе пытаемся найти синоним с маской
        elseif(isset($synonyms[mb_strtolower($offer['vendor'])]) && mb_stripos($synonyms[mb_strtolower($offer['vendor'])], '*') != false){
          //из синонима генрим паттерн для поиска
          $pattern = str_replace('*', '\w*', $synonyms[strtolower($offer['vendor'])]);
          preg_match('/' . $pattern . '/i', $offer['model'], $arSResult);
          //если ничего не найлено, то ругаемся, по идде должны найти производителя
          if(empty($arSResult[0])){
            $error[] = 'Что не те так!!! Не удалось найти ' . $pattern . ' в товаре ' . $offer['model'];
            continue;
          }
          $offer['vendor'] = $arSResult[0];
          $offer['model'] = trimByVendor($offer['model'], $offer['vendor']);
        }
        else{
          $GLOBALS['newVendors'][$offer['vendor']] = $offer['id']." ".$offer['model'];
          continue;
        }
          
        $xml->elementStart('offer', array('id'=>$offer['id'], 'type'=>'vendor.model', 'available'=>'true'));
          //url
          $xml->elementStart('url');
            $xml->text(str_replace(' ', '', $offer['url']));
          $xml->elementEnd('url'); 
          //price
          $xml->elementStart('price');
            $xml->text($offer['price']);
          $xml->elementEnd('price');         
          //currencyId
          $xml->elementStart('currencyId');
            $xml->text('RUR');
          $xml->elementEnd('currencyId');     
          //categoryId
          $xml->elementStart('categoryId');
            $xml->text($offer['categoryId']);
          $xml->elementEnd('categoryId');    
          //picture
          $xml->elementStart('picture');
            $xml->text($offer['picture']);
          $xml->elementEnd('picture');    
          //typePrefix
          $xml->elementStart('typePrefix');
            $xml->text($offer['typePrefix']);
          $xml->elementEnd('typePrefix'); 
          //vendor
          $xml->elementStart('vendor');
            $xml->text($offer['vendor']);
          $xml->elementEnd('vendor'); 
          //model 
          $xml->elementStart('model');
            $xml->text($offer['model']);
          $xml->elementEnd('model'); 
          //description
          $xml->elementStart('description');
            $xml->text($offer['description']);
          $xml->elementEnd('description'); 
        
          /*foreach($offer['params'] as $paramName=>$paramValue){
            $xml->elementStart('param', array('name'=>$paramName));
              $xml->text($paramValue);
            $xml->elementEnd('param'); 
          }*/    
        $xml->elementEnd('offer'); 
      }
      $xml->elementEnd('offers'); 
  
  
    $xml->elementEnd('shop');
  $xml->elementEnd('yml_catalog');
  $xml->endXML();
    
  return file_get_contents('temp');
}

//рекурсивная чистка данных от лишних проблеллов
function cleanArrayRecursive($data){
  if(is_array($data)){
    foreach($data as $num=>$child){
      $data[$num] = cleanArrayRecursive($child);
    }
  }
  else{
  	$data = iconv("UTF-8", "WINDOWS-1251", $data);
		//убираем пробелы сначала и с конца
		$data = trim($data);
		//убираем парные пробелы
		$data = preg_replace('/\s+/', ' ', $data);
		$data = iconv("WINDOWS-1251", "UTF-8", $data);	
  }
  return $data;
}



//сласс для ускыорения написания
class xml_output{
	public $xw=null;
 
    public function __construct(){
		$this->xw = new XMLWriter();
		$this->xw->openURI('temp');
		$this->xw->setIndent(true);
	}
 
    function startXML(){
        $this->xw->startDocument('1.0', 'utf-8');
    }
 
    function endXML(){
        $this->xw->endDocument();
        $this->xw->flush();
    }
 
    function element($tag, $attrs=null, $content=null){
        $this->elementStart($tag, $attrs);
        if (!is_null($content)){
            $this->xw->text($content);
        }
        $this->elementEnd($tag);
    }
 
    function elementStart($tag, $attrs=null){
        $this->xw->startElement($tag);
        if (is_array($attrs)){
            foreach ($attrs as $name=>$value){
                $this->xw->writeAttribute($name, $value);
            }
        } elseif(is_string($attrs)){
            $this->xw->writeAttribute('class', $attrs);
        }
    }
 
    function elementEnd($tag){
        static $empty_tag = array('base', 'meta', 'link', 'hr', 'br', 'param', 'img', 'area', 'input', 'col');
        if (in_array($tag, $empty_tag)) {
            $this->xw->endElement();
        } else {
            $this->xw->fullEndElement();
        }
    }
 
    function text($txt){
        $this->xw->text($txt);
    }
 
    function raw($xml){
        $this->xw->writeRaw($xml);
    }
 
    function comment($txt){
        $this->xw->writeComment($txt);
    }
 
}

function getFilesListByUrl($url){
  $data = file_get_contents($url);
  preg_match_all('/.json">(.*.json)/', $data, $result);
  $arReturn= array();
  foreach ($result[1] as $fileName) {
    $arReturn[] = trim($fileName);
  }
  return $arReturn;
}

function getFileDataByUrl($url){
  $content = null;
  $url = $url . $arFiles[0];
  $http = fopen($url,"r");
  while( !feof($http)) {
  $content .= fgets($http,1024);
  }
  fclose($http);
  return $content;
}

function trimByVendor($model, $vendor){  
	//echo $model . ' "' . $vendor . '" = ';
  $startPosition = mb_stripos($model, $vendor, 0, 'utf8') + mb_strlen($vendor, 'utf8');
  //echo '(' . $startPosition . ')';
  $model = trim(mb_substr($model,  $startPosition, 9999, 'utf-8'));
	//echo $model . '<br/>';
  return $model;
}
?>